import BigNumber from "bignumber.js";
// import { BigNumber } from "./node_modules/bignumber.js/bignumber.mjs";

// 开启后，如果传入的值格式不正确，控制台会报错，不开启，返回对象是null
BigNumber.DEBUG = true

// 全局配置，保留小数点后五位，四舍五入。初始化如果指定base，也会生效。所以不要指定，除非需要
BigNumber.config({ DECIMAL_PLACES: 5 })

// 设置指数表示法 EXPONENTIAL_AT只有一个数字 表示正负
BigNumber.config({ EXPONENTIAL_AT: 2 })
new BigNumber(12.3)         // '12.3'        1.23e+1 不符合
new BigNumber(123)          // '1.23e+2'     符合 显示
new BigNumber(0.123)        // '0.123'       1.23e-1 不符合
new BigNumber(0.0123)       // '1.23e-2'
// [-7, 20] 负数位超7，整数位超20位
BigNumber.config({ EXPONENTIAL_AT: [-7, 20] })
new BigNumber(123456789)    // '123456789'   e is only 8
new BigNumber(0.000000123)  // '1.23e-7'
// Almost never return exponential notation:不指数表示
BigNumber.config({ EXPONENTIAL_AT: 1e+9 })
// Always return exponential notation:总是指数表示
BigNumber.config({ EXPONENTIAL_AT: 0 })

// 设置取整模式
BigNumber.config({ ROUNDING_MODE: 0 })
BigNumber.set({ ROUNDING_MODE: BigNumber.ROUND_UP })    // equivalent

//POW_PRECISION 是用于控制指数运算精度的配置选项。默认值是0，不做限制
BigNumber.config({ POW_PRECISION: 10 });

// ALPHABET 字母表示法
// (base 12) 12进制表示
BigNumber.config({ ALPHABET: '0123456789TE' })
// x = new BigNumber('T', 12)
// x.toString()                // '10' 默认10进制表示
// x.toString(12)              // 'T' 12进制表示

// 克隆一个新的构造器
let newBigNumber = BigNumber.clone({ DECIMAL_PLACES: 9 })

let ROUND_MODE = {
    ROUND_UP: 0,
    ROUND_DOWN: 1,
    ROUND_CEIL: 2,
    ROUND_FLOOR: 3,
    ROUND_HALF_UP: 4,
    ROUND_HALF_DOWN: 5,
    ROUND_HALF_EVEN: 6,
    ROUND_HALF_CEIL: 7,
    ROUND_HALF_FLOOR: 8,
}

/**
    BigNumber.ROUND_UP: 向上舍入。如果小数部分大于等于 0.5，则向上舍入；否则，向下舍入。
    BigNumber.ROUND_DOWN: 向下舍入。无论小数部分的值如何，都直接向下舍入。
    BigNumber.ROUND_CEIL: 向正无穷方向舍入。如果是正数，则向上舍入；如果是负数，则向下舍入。
    BigNumber.ROUND_FLOOR: 向负无穷方向舍入。如果是正数，则向下舍入；如果是负数，则向上舍入。
    BigNumber.ROUND_HALF_UP: 四舍五入。如果小数部分大于等于 0.5，则向上舍入；否则，向下舍入。
    BigNumber.ROUND_HALF_DOWN: 五舍六入。如果小数部分大于 0.5，则向上舍入；否则，向下舍入。
    BigNumber.ROUND_HALF_EVEN: 银行家舍入法。如果小数部分恰好等于 0.5，则根据前一位的奇偶性决定舍入方向。
    BigNumber.ROUND_HALF_CEIL: 向最接近的整数方向舍入，同时遵循 BigNumber.ROUND_CEIL 的规则。
    BigNumber.ROUND_HALF_FLOOR: 向最接近的整数方向舍入，同时遵循 BigNumber.ROUND_FLOOR 的规则。
 */

//第一个参数是字符串，第二个参数是要转成什么进制
export function getBigNumber(value, n) {
    if (n === undefined || n === null || n == '') {
        return new BigNumber(value);
    }
    return new BigNumber(value, n);
}

//第一个参数是字符串，第二个参数是要转成什么进制
export function plus(v1, v2, place, roundMode) {
    let BN = BigNumber.clone({ DECIMAL_PLACES: place, ROUNDING_MODE: roundMode, ALPHABET: '0123456789TE'})
    let x = new BN('T', 12)
    x.toString()                // '10' 默认10进制表示
    x.toString(12)              // 'T' 12进制表示
    console.log(x.toString(),x.toString(12));
    return BN(v1).plus(v2).toNumber();;
}

export default {
    ROUND_MODE,
    getBigNumber,
    plus
}